package com.liuhouse.handler.mybatisplus;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.liuhouse.utils.SecurityUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;

/**
 * 自动填充
 * mybatis是有自动填充的这个功能的 用一次会了  以后就都会了 以后经常用
 * 这个类是用来配置mybatis的字段的自动填充的,用于发送评论功能,由于我们在评论表无法对下面自个字段插入数据(原因是前端在发送评论数据的时候)
 * 没有提供下面四个字段，所以后端在往数据库中插入数据的时候,下面的四个字段都是空值
 * 所以就需要这个类来帮助我们往下面这四个字段中自动插入值
 * 只要我们更新了评论表中的字段,那么就无法插入值的字段就自动的有值了
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    //只要对数据库执行了插入语句,那么就会执行到这个方法
    public void insertFill(MetaObject metaObject) {
        Long userId = null;
        try {
            //获取用户Id
            userId = SecurityUtils.getUserId();
        } catch (Exception e) {
            e.printStackTrace();
            userId = -1L;//如果出现了异常,就说明该用户还没有注册,我们就把该用户的userid字段赋值为-1
        }
        //自动把下面四个字段新增进行自动填充
        //调用当前类的方法  给 metaObject对象设置字段，值
        this.setFieldValByName("createTime" , LocalDateTime.now(), metaObject);
        this.setFieldValByName("createBy" , userId , metaObject);
        this.setFieldValByName("updateTime" , LocalDateTime.now() ,metaObject);
        this.setFieldValByName("updateBy" , userId , metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime" , LocalDateTime.now() , metaObject);
        //最好的方式是 不要自动填充 操作人
//        try {
//            this.setFieldValByName("updateBy" , SecurityUtils.getUserId() , metaObject);
//        } catch (Exception e) {
//            System.out.println("自动更新不需去要更新修改人的信息,只需要修改viewCount就可以");
//        }
    }
}
